package com.itheima.edu.info.manager.service;

import com.itheima.edu.info.manager.dao.BaseStudentDao;
import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.factory.StudentDaoFactory;

import java.io.*;

/*
    业务员类
        1. 这里的所有方法【功能】都是给客服用
        2. 如果某些业务涉及到要对数据仓库的数据进行访问的话,那么需要在业务员类中操作库管对象
        3. 该类的核心作用是用于处理业务逻辑,例如: 判断录入的id是否存在
 */
public class StudentService {
    /*
        现象: 对于业务存储模型的切换需要频繁改动Service中的代码,那么这种现象我们称之为service和dao之间存在强耦合性
        目标: 不管我业务存储模型怎么切换,我们都期望service中代码不发生改变   -- 解开service和dao之间的耦合

        解决方案: 需要引入第三者 + 利用多态语法

     */
    //1. 创建库管类: StudentDao的对象,调用库管的添加学生方法
    private BaseStudentDao studentDao = StudentDaoFactory.getStudentDao();

    //添加学生
    public boolean addStudent(Student stu) {
        //2. 将库管添加学生后的结果返回给调用者: 客服
        return studentDao.addStudent(stu);
    }

    //判断学号在系统【数据仓库】中是否存在
    public boolean isExists(String sid) {
        //1. 让库管把仓库中所有数据都拿过来
        Student[] stuArray = studentDao.findAllStudent();

        //2. 定义一个标记: boolean flag = false,初始值为false,表示假设输入的sid在数据仓库中不存在
        boolean flag = false;

        //3. 遍历stuArray,拿到每一个学生对象,取每个学生对象的sid和传进来的sid进行比较
        for (int i = 0; i < stuArray.length; i++) {
            Student stu = stuArray[i];              //stuArray = {stu,null,null,null,null}
            //判断当前学生对象不为空并且当前学生对象的学号和用户录入的学号是否一致
            if (stu != null && stu.getSid().equals(sid)) {
                //一致说明存在
                flag = true;
                break;
            }
        }
        //4. 返回flag的值
        return flag;
    }

    //查询所有学生信息
    public Student[] findAllStudent() {
        //1. 调用库管的查询所有学生信息的方法,拿到所有学生对象
        Student[] allStudent = studentDao.findAllStudent();  //allStudent = {null,null,null,null,null}
        /*
            2. 对库管查到的学生数据进行判断
                2.1 如果库管给的学生数组里装的全是null,我们就直接返回一个null给客服
                2.2 如果库管给的学生数组里有一个不是null,就说明系统中有学生信息,我们就把整个数组返回给客服
         */
        //先定义一个标记: boolean flag = false,默认值表示先假设数组里全是null
        boolean flag = false;
        //遍历数组allStudent,只要有一个索引位置不为null,就修改标记为true
        for (int i = 0; i < allStudent.length; i++) {
            Student stu = allStudent[i];
            if (stu != null) {
                flag = true;
                break;
            }
        }
        //根据flag的值来决定当前方法的返回值
        if (flag) {
            //说明allStudent中有学生对象,这时返回allStudent即可
            return allStudent;
        } else {
            //flag为false,则表示allStudent中全是null,一个学生对象都没有,这时直接返回null
            return null;
        }
    }

    //删除学生
    public boolean deleteStudent(String delId) {
        // 指挥库管将id对应的学生对象从数据仓库中移除
        studentDao.deleteStudent(delId);
        return true;
    }

    //修改学生
    public boolean updateStudent(String updateId, Student stu) {
        studentDao.updateStudent(updateId, stu);
        return true;
    }
    //将库管添加管理员后的结果返回给调用者: 客服
    public boolean addAdminstator(String name,String password) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("studentServer\\prop.properties",true));
        bw.write(name+"="+password+System.lineSeparator());
        bw.flush();
        return true;
    }


}
